{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "310e916d",
   "metadata": {},
   "source": [
    "# Tutorial 1f  - Differentiable Ray Tracing Hello World"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "826af788",
   "metadata": {},
   "source": [
    "### May 2025"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf07e82f",
   "metadata": {},
   "source": [
    "As you may have noticed, Optiland now supports swappable backends (as of now the options are: Numpy and PyTorch) that allow you to customize your workflow. Do you want to quickly design a simple system using traditional methods of numerical optimization? Choose numpy as the backend. Do you want to learn about differentiable ray tracing and how to combine Optiland with your ML/DL pipeline? Choose torch as the backend.\n",
    "\n",
    "Throughout this notebook you will gain the necessary skills to learn how to swap backends, and how to use PyTorch for a simple optimization problem. Dial in :)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4420c229",
   "metadata": {},
   "source": [
    "### Differentiable Ray Tracing - Basics "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2e4d719c",
   "metadata": {},
   "source": [
    "Differentiable ray tracing **(DRT)** offers some notable advantages over traditional methodologies - especially when it comes to optimization. Conventional approaches generally involve applying small perturbations to design parameters and running discrete ray-tracing simulations repeatedly to estimate gradients. In contrast, DRT integrates **automatic differentiation** to compute these gradients directly and more efficiently by constructing a computational graph of the ray tracing process and then applying backpropagation.\n",
    "\n",
    "Therefore, with a fully differentiable ray tracing pipeline, all the necessary steps (from ray intersections to refraction to image formation), are performed keeping in mind automatic differentiation. By enabling everything to be computed in an automatic differentiation framework like PyTorch, we allow the software to directly compute the gradient of our final merit function with respect to all the design parameters, which in turn opens the door to the usage of standard gradient-based algorithms like GD, SGD, Adam, etc (as opposed to relying on the finite difference approximations of the Jacobian, as in the standard DLS optimization algorithm)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7bd0cf64",
   "metadata": {},
   "source": [
    "That being said, let's get started with the practical application!"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8143c18e",
   "metadata": {},
   "source": [
    "### 1. Changing the backend"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "68cc0a7e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Begin by importing the backend module instead of numpy or torch directly\n",
    "import optiland.backend as be"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "546f7328",
   "metadata": {},
   "source": [
    "To switch to PyTorch:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "61a6d9c6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.float32\n"
     ]
    }
   ],
   "source": [
    "# set backend\n",
    "be.set_backend(\"torch\")\n",
    "be.set_device(\n",
    "    \"cpu\"\n",
    ")  # we will stick to cpu for now. \"cuda\" is also possible for GPU calculations.\n",
    "print(be.get_precision())  # check the precision\n",
    "\n",
    "# enable the gradient mode: to tell autograd to begin recording operations on a Tensor tensor\n",
    "be.grad_mode.enable()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "977d22e0",
   "metadata": {},
   "source": [
    "### 2. Design Workflow - from task to final optimized design"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d627a99e",
   "metadata": {},
   "source": [
    "In this simple example, we are concerned with optimizing a singlet lens radii for achieving the smallest RMS spot size at a distance of 70 mm from the second surface of the lens."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "b704f229",
   "metadata": {},
   "outputs": [],
   "source": [
    "from optiland.optic import Optic\n",
    "from optiland.materials import Material\n",
    "from optiland.analysis import SpotDiagram\n",
    "\n",
    "\n",
    "class SingletConfigurable(Optic):\n",
    "    \"\"\"A configurable singlet lens.\"\"\"\n",
    "\n",
    "    def __init__(self, r1, r2, t2, material_name):\n",
    "        super().__init__()\n",
    "        ideal_material = Material(material_name)\n",
    "\n",
    "        self.add_surface(index=0, radius=be.inf, thickness=be.inf)\n",
    "        self.add_surface(\n",
    "            index=1, thickness=7.0, radius=r1, is_stop=True, material=ideal_material\n",
    "        )\n",
    "        self.add_surface(index=2, radius=r2, thickness=t2)\n",
    "        self.add_surface(index=3)\n",
    "\n",
    "        self.set_aperture(aperture_type=\"EPD\", value=25)\n",
    "\n",
    "        self.set_field_type(field_type=\"angle\")\n",
    "        self.add_field(y=0.0)\n",
    "\n",
    "        self.add_wavelength(value=0.55, is_primary=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3b697d12",
   "metadata": {},
   "source": [
    "Notice how you can build your singlet in a Class. This allows easy reproducibility and customization and extra calls.\n",
    "\n",
    "Let's have a look what the lens look like at the moment."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "92d6a90e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "╒════╤═════════════════╤═══════════╤══════════╤═════════════╤════════════╤═════════╤═════════════════╕\n",
      "│    │ Type            │ Comment   │   Radius │   Thickness │ Material   │   Conic │   Semi-aperture │\n",
      "╞════╪═════════════════╪═══════════╪══════════╪═════════════╪════════════╪═════════╪═════════════════╡\n",
      "│  0 │ Planar          │           │      inf │         inf │ Air        │       0 │       12.5      │\n",
      "│  1 │ Stop - Standard │           │       70 │           7 │ BK7        │       0 │       12.5      │\n",
      "│  2 │ Standard        │           │      -70 │          70 │ Air        │       0 │       12.0732   │\n",
      "│  3 │ Planar          │           │      inf │         nan │ Air        │       0 │        0.668569 │\n",
      "╘════╧═════════════════╧═══════════╧══════════╧═════════════╧════════════╧═════════╧═════════════════╛\n"
     ]
    }
   ],
   "source": [
    "lens = SingletConfigurable(r1=70.0, r2=-70.0, t2=70.0, material_name=\"BK7\")\n",
    "lens.draw(num_rays=10)\n",
    "lens.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fc2b010d",
   "metadata": {},
   "source": [
    "It is clear that the image plane is far from the best focus. Recall that here we assume the \"best focus\" to be the smallest possible RMS spot size. And, speaking of, let's now check it's actual value:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "46ad84c2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Initial RMS Spot Radius: 0.9442 mm\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAekAAAFbCAYAAADxzHbpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQChJREFUeJzt3Ql4FFXWN/CTEJIQQjYSwhICCQFkD4ow4AKOCAjjgLiAyuaroIyMw+ICrwqDGy6MOjIoiAMIMqLO4AYK4oKOssmmCMjIToAEQkJIIBtJfc+533S/naQ76aWq696q/+95mqYrVd2nq6rr1L11694QTdM0AgAAAOmEmh0AAAAAuIckDQAAICkkaQAAAEkhSQMAAEgKSRoAAEBSSNIAAACSQpIGAACQFJI0AACApJCkAQAAJIUkDQAAICkkaYtbunQphYSE0LZt29z+vV+/ftS5c+egxPLxxx/T5ZdfTpGRkZSamkqzZs2iS5cuebVsZWUlvfDCC5SWliaW79q1K73zzjtu5923bx8NGjSIoqOjKSEhgUaPHk1nzpwJ6D29ceTIEbGu586d6/bvf/7zn8Xfc3NzyUhWX88AdoIkDUHx2Wef0bBhwyguLo7mzZsn/v/000/TH//4R6+Wf+yxx+jRRx+lG264QSzPyefOO++klStXVpkvKyuLrr32Wjpw4AA9++yz9NBDD9GaNWvEcmVlZX69p0qwngEshgfYAOtasmQJD6Ci/fDDD27/3rdvX61Tp06Gx9GxY0etW7duWnl5uXPaY489poWEhGj79u2rddmsrCytfv362gMPPOCcVllZqV1zzTVaSkqKdunSJef0iRMnag0aNNCOHj3qnLZ+/XqxDhYuXOjXe3rr8OHD4nNefPFFt3+fNWuW+PuZM2c0o9hhPQPYCUrSUMWSJUtElezixYurTOfSEk//9NNPndNOnTpFv/zyC5WXl9f6nnv37hWPCRMmUFhYmHP6H/7wBz5JpH/+85+1Lv/RRx+Jz+D5HTiWiRMnihLdpk2bnNP/9a9/0e9+9ztRWnPo378/tWvXjt577z2/3tMoXA1dv359t1XEvK64NFxSUoL1DGBjSNI2UVBQIK6FVn9UP/Dffffd4uA7depUOn78uJi2e/dumj17Nt1zzz00ePBg57wzZsygDh060IkTJ2r97J07d4rnHj16VJnevHlzSklJcf69tuUbNmwoPstVz549q7w/x3H69Okan+OY1/VzvH1Pf1y8eNHtuubprvgaLl8rfvfdd6tM5+piTqi33HKLuIaL9QxgX0jSNsGlnKSkpBqPjRs31ph30aJFVK9ePZGUOWGMHTuWmjZtSi+99JJfn80lQdasWbMaf+NpJ0+erHP55ORkUQKrvixzLF/X5+Tl5VFpaalP7+lvCdndun7xxRerzJeRkUG9e/emt99+u8p0vrabn58vkrgv7LaeAezg/+rEwNLmz58vqiKrmzZtGlVUVFSZxgmZ57/jjjvommuuoV27dtH69espJiamRstxftSluLhYPEdERNT4G5cUz58/X+fynpZ1ff+6Psf1vbx9T39wdfNtt91WY/qyZcto+fLlVaaNGTNGVP0ePHiQ2rRpI6atWLGCWrZsSX379hWvsZ4B7AtJ2ia4etFd9WR8fLzbW4JGjhwpSnhcquOkc/311/v92Q0aNBDPjtKVK77m6vh7bct7Wtb1/ev6nOrzejOfP9q2bStqLqr77rvvakwbMWIETZ48WSTmmTNnissSq1evpilTptQofdbFbusZwA5Q3Q1unT171nlvNTdG4ntd/eWo2nRUk7riaXzNtK7ls7OzReOn6ssyx/J1fQ7fy+so1Xn7nkbjkyRuA8BJmvG1aE5qo0aN8vm9sJ4BrAdJGtx64IEHqLCwkObMmSNKgK+88orf75WZmSmeq3eowtcjuYWv4++1Lc+NrrjzDFdbtmyp8v4tWrQQ137dddyydevWKp/j7XsGA1d5/+c//6EffvhBJOvu3btTp06dfH4frGcACzL7HjCQ7z7p999/Xyzz6quvitcjR44U98Tu37+/ynwnT54U996WlZXVGcdll10m7t91vS/28ccfF/fv7t271znt3Llz4j352eH48eMe77Vt0aJFlfe8//77RazHjh1zTvviiy/E93n99df9ek+j75Pm9ZeYmKjdcsstWmhoqPaXv/ylyt+xngHsC0na4nxN0jk5OSJhXHfddeJgynJzc7Xk5GStd+/eWkVFhXPesWPHivfm5FSXTz75RCSK3/72t9obb7yhPfjggyIhjR8/3m28/Ozq4YcfFtMnTJigLVq0SBsyZIh4vWLFiirzcdJo3Lix1qZNG3GS8eyzz2rx8fFaly5dtJKSEr/e01NMenZmMmnSJPG3evXqiaTsyi7r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",
      "text/plain": [
       "<Figure size 1200x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# RMS Spot Size Analysis\n",
    "spot_diagram = SpotDiagram(lens)\n",
    "rms_value = spot_diagram.rms_spot_radius()\n",
    "print(f\"\\nInitial RMS Spot Radius: {rms_value[0][0]:.4f} mm\")\n",
    "\n",
    "# Spot Diagram visualization\n",
    "spot_diagram.view(add_airy_disk=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "32e8df39",
   "metadata": {},
   "source": [
    "Now, we set up the optimization to minimize the RMS spot size using PyTorch's autograd.\n",
    "We need to:\n",
    "\n",
    "1. Identify the parameters to optimize (Lens radii R1, R2).\n",
    "2. Define a PyTorch optimizer (e.g., Adam).\n",
    "3. Define the loss function (RMS spot radius)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "03002054",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[tensor(70., requires_grad=True), tensor(-70., requires_grad=True)]\n"
     ]
    }
   ],
   "source": [
    "import torch.optim as optim\n",
    "\n",
    "# --- Parameter Handling ---\n",
    "\n",
    "# Get initial values\n",
    "radius1_param = lens.surface_group.surfaces[1].geometry.radius\n",
    "radius2_param = lens.surface_group.surfaces[2].geometry.radius\n",
    "params_to_optimize = [radius1_param, radius2_param]\n",
    "print(params_to_optimize)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "09aa3ee2",
   "metadata": {},
   "source": [
    "**NOTE:** When using the PyTorch backend with gradient mode enabled, Optiland allows direct access to certain geometric parameters (like surface radii) as tensors that participate in the computation graph. This enables us to pass them directly to a PyTorch optimizer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "c2f2d816",
   "metadata": {},
   "outputs": [],
   "source": [
    "# --- Optimizer ---\n",
    "# We use the Adam optimizer, common for deep learning tasks.\n",
    "# We pass the tensors we want to optimize.\n",
    "learning_rate = 0.2  # Adjust as needed\n",
    "optimizer = optim.Adam(params_to_optimize, lr=learning_rate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "7939a5da",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Optimization setup complete.\n",
      "Optimizing: R1, R2\n",
      "Initial values: (R1=70.00, R2=-70.00)\n",
      "\n",
      "Starting optimization...\n",
      "Iteration 25/100, Loss (RMS Spot Radius): 0.263034 mm\n",
      "  R1: 74.9251, R2: -74.9241\n",
      "Iteration 50/100, Loss (RMS Spot Radius): 0.127734 mm\n",
      "  R1: 76.8283, R2: -76.8953\n",
      "Iteration 75/100, Loss (RMS Spot Radius): 0.115021 mm\n",
      "  R1: 76.3996, R2: -76.6142\n",
      "Iteration 100/100, Loss (RMS Spot Radius): 0.114965 mm\n",
      "  R1: 76.2613, R2: -76.6589\n",
      "Optimization finished.\n"
     ]
    }
   ],
   "source": [
    "# --- Loss Function ---\n",
    "# The function to minimize is the RMS spot radius.\n",
    "# We need a way to calculate this within the loop using the current tensor values.\n",
    "\n",
    "\n",
    "def calculate_loss(lens):\n",
    "    \"\"\"Calculates the RMS spot radius for the current lens state.\"\"\"\n",
    "    rms_values_nested = SpotDiagram(lens).rms_spot_radius()\n",
    "    rms_scalar = rms_values_nested[0][0]\n",
    "    return rms_scalar\n",
    "\n",
    "\n",
    "print(\"\\nOptimization setup complete.\")\n",
    "print(f\"Optimizing: R1, R2\")\n",
    "print(f\"Initial values: (R1={radius1_param:.2f}, R2={radius2_param:.2f})\")\n",
    "\n",
    "\n",
    "# --- Optimization Loop ---\n",
    "# We run the standard PyTorch training loop.\n",
    "\n",
    "num_iterations = 100\n",
    "print(\"\\nStarting optimization...\")\n",
    "losses = []\n",
    "for i in range(num_iterations):\n",
    "    optimizer.zero_grad()\n",
    "\n",
    "    # --- Calculate Loss ---\n",
    "    loss = calculate_loss(lens)\n",
    "    losses.append(loss.item())\n",
    "    # --- Backpropagation and Optimization Step ---\n",
    "    loss.backward()  # Calculate gradients\n",
    "    optimizer.step()  # Update tensors based on gradients\n",
    "\n",
    "    # --- Print Progress ---\n",
    "    if (i + 1) % 25 == 0:\n",
    "        print(\n",
    "            f\"Iteration {i + 1}/{num_iterations}, Loss (RMS Spot Radius): {loss.item():.6f} mm\"\n",
    "        )\n",
    "        print(f\"  R1: {radius1_param.item():.4f}, R2: {radius2_param.item():.4f}\")\n",
    "\n",
    "print(\"Optimization finished.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "d26c8528",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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cFNKLi4umDBhgrol42Jdmw7r2rRY36bDuratura5AcVERERk3dhyQ0RERFaF4YaIiIisCsMNERERWRWGGyIiIrIqDDelNHPmTISEhMDV1RVt2rRBWFiY1kWyeFOnTkWrVq3U6tGVKlXCgAEDcPr06ULPuX37Nl577TVUqFABHh4eeOqpp5CQkKBZma3Bp59+qlbr/vvf/55/jfVsWLGxsXj22WdVfbq5uaFRo0Y4cOBA/uMyr+PDDz9E5cqV1ePdu3fHmTNnNC2zJcrJycH48eNRvXp1VY81a9bEpEmTCu1FxLounR07dqBv375qdWD592LVqlWFHi9OvV69ehXDhw9XC/t5e3vjpZdewo0bN2AUMluKSmbp0qU6Z2dn3fz583UnTpzQjRo1Suft7a1LSEjQumgWrVevXroFCxbojh8/rjt8+LCud+/eumrVqulu3LiR/5xXXnlFFxQUpNu8ebPuwIEDurZt2+rat2+vabktWVhYmC4kJETXuHFj3VtvvZV/nfVsOFevXtUFBwfrXnjhBd2+fft058+f161fv1539uzZ/Od8+umnOi8vL92qVat0R44c0fXr109XvXp13a1btzQtu6WZPHmyrkKFCro1a9booqKidL/++qvOw8ND9/XXX+c/h3VdOmvXrtWNGzdOt3LlSkmKut9++63Q48Wp18cee0zXpEkT3d69e3U7d+7U1apVSzd06FCdMTDclELr1q11r732Wv79nJwcXWBgoG7q1KmalsvaJCYmqv+Jtm/fru6npKTonJyc1D9YehEREeo5e/bs0bCkliktLU1Xu3Zt3caNG3WdO3fODzesZ8P65z//qevQocN9H8/NzdUFBAToPv/88/xr8mfg4uKi+/nnn01USuvQp08f3Ysvvljo2sCBA3XDhw9X56xrw7g73BSnXk+ePKlet3///vzn/PHHHzo7OztdbGysztDYLVVCmZmZOHjwoGpyK7hfldzfs2ePpmWzNtevX1e3vr6+6lbqPSsrq1Dd16tXD9WqVWPdl4J0O/Xp06dQfQrWs2H9/vvvaNmyJZ5++mnV3dqsWTPMnTs3//GoqCjEx8cXqm/ZP0e6u1nfJdO+fXts3rwZkZGR6v6RI0ewa9cuPP744+o+69o4ilOvcitdUfL/gp48X74/9+3bZ/Ay2dzGmWWVnJys+nX9/f0LXZf7p06d0qxc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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# --- Visualization of Loss per Epoch ---\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.figure()\n",
    "plt.plot(range(1, num_iterations + 1), losses)\n",
    "plt.xlabel(\"Iteration\")\n",
    "plt.ylabel(\"Loss (RMS Spot Radius) [mm]\")\n",
    "plt.title(\"Loss per Iteration\")\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "c972826c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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NrXj+kCWJSvV07Yy7swFAUZduAfBkMGbx7vevXs33XvvvfTll19Sly5dROC2+e2338QY2B9++CHNmzePli9fTrfddpuW220YKNsM/gNZlqxU123lzlweWbUHAUZluAfBsMF7wIAB9M9//pMiIyPdvs+pbn6NGjWKDhw4QGfOnFF7Ow0LZZuheSDLcmxt24oAox3cg2DYTlomTJjgMXC7atu2LfXu3bum22UanvrJRtmmNp2vyNr5idH2R09wD4LpelgrLi6mS5cuOb3AP5563sIv/pox2gPZaPujJ7gHwRS1zY8dO0aTJk2izZs309Wr//vVz9l5fNFXVlaqvY2GJ1M5rCxkqpxmxv3RG9yDYPjgfd9994lAvWTJEkpLSxMBG2pOpnJYWWqY88PYSA9k1wDDUPNcPbgHwdDB++eff6Zdu3ZRq1attNkigBowepMfW4Ax+n4CgMpl3l27dqVTp075+zEAzZllJCmz7CcAqJjy/r//+z/REUtOTg5dd911VWqht2/f3t9VAqjCLE1+zLKf8D/8A62iogJ1igwuPDycIiIifCqO9jt4nz9/no4ePUpjxoyxz+MvQoU1CDWzdClqlv2E35WVlYm+M7g7ajC+uLg4atCgAUVFRakbvP/f//t/oi9z7k0NFdZAT8xSI9ss+wlEVqtVtPDhFFnDhg3FAx3PXGPiBDD/UOMEMp/za665hsLCwtQL3jwgyaeffkotWrSo6bYCqIrLfBsmxdLU21pSVESYoWtho+a5OfDDnAN4enq6SJGBscXGxoqiaI6zfO5jYmLUC9633nqrqHGO4A164q72NQ/zaWSoeW4e3lJgYM5z7Xfw/tOf/kSPPPII7d27l9q1a1elwhoPYgIQTGbu99vM+w5gZn4Hb65pzp599tkq76HCGoSCmWtfm3nfAczM77wYLn/x9ELghlAwc7/fZt53ADNDQQpIz8wDS5h530HfFixYQE2aNBGVrrp37047duzwuvyyZcvE9ev4cq2wNXr06CrL9OvXz2mZixcv0vDhwyk+Pp4SExNp7NixYhAtR7/88gvdfPPNYv1cGfCll14iw2ebs507d9LXX39N586dEyluR/PmzSOtL4iXX36Zzp49Sx06dKD58+dTt27dPC6/Zs0aeuqpp+j48eOi6v2cOXOof//+9ve5rHDmzJm0ePFiKigooD/84Q/01ltv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",
      "text/plain": [
       "<Figure size 1200x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "SpotDiagram(lens).view(add_airy_disk=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "10a71581",
   "metadata": {},
   "source": [
    "### Conclusion"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a2141eac",
   "metadata": {},
   "source": [
    "Congratulations! You have successfully:\n",
    "\n",
    "- Switched Optiland's computational backend to PyTorch.\n",
    "- Defined a parameterized singlet lens model.\n",
    "- Set up and executed a gradient-based optimization loop using PyTorch's `optim.Adam`.\n",
    "- Leveraged Optiland's differentiable ray tracing capabilities to calculate the RMS spot size as the loss function.\n",
    "- Observed how the optimizer iteratively adjusted the lens radii (and potentially thickness) to significantly minimize the RMS spot size, improving the lens's focus quality.\n",
    "\n",
    "This tutorial demonstrates the power of combining automatic differentiation frameworks like PyTorch with optical simulations. By directly accessing gradients through the differentiable ray tracer, we can use efficient optimization algorithms standard in machine learning for optical design tasks.\n",
    "\n",
    "**Next Steps:**\n",
    "\n",
    "- Experiment with optimizing different parameters (e.g., conic constants, different thicknesses).\n",
    "- Try different PyTorch optimizers or learning rates.\n",
    "- Define a more complex merit function incorporating other aberrations or constraints.\n",
    "- Explore using the GPU (`be.set_device('cuda')`) for potentially faster optimization, especially with more complex systems or larger ray sets.\n",
    "- Check out the gallery examples for more educative design examples that leverage the DRT!"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
